package com.chencong.service;

import com.alibaba.fastjson.JSONObject;
import com.chencong.entity.User;
import com.chencong.request.Request;
import com.chencong.session.MySession;
import com.chencong.util.Constant;

import java.io.*;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

/**
 * @author chencong
 * @date 2020/12/14 下午1:43
 */
public class UserService {
    private Request request;//请求对象
    private DataOutputStream dos;//输出流
//    private static User onlineUser;//在线用户
    private static int maxID = -1;//数据库中最大的id,用来保证用户id唯一
    private PageService ps;//用来弹出页面信息
    private FileService fs;//用来向文件读写数据
    private List<User> users;


    public UserService(DataOutputStream dos, Request request) throws Exception {
        this.dos = dos;
        this.request = request;
        this.ps = new PageService(dos);
        this.fs = new FileService();
    }

    /**
     * 用户登录
     *
     * @param data
     * @return
     * @throws Exception
     */
    public boolean login(String data) throws Exception {
        User user = JSONObject.parseObject(data, User.class);
        List<User> users = loadUser();
        boolean flag = false;
        long count = users.stream().filter(user1 -> user1.equals(user)).count();
        if (count == 0) {
            System.out.println("登录失败");
            ps.sendData("用户名或密码错误", false);
            return false;
        } else {
            MySession.onlineUser = user;
            System.out.println("登录成功");
            //状态码: 后端发送给前端 如果发送成功 200
            ps.sendData("登录成功");
            return true;
        }
    }

    /**
     * 查询本地所有用户
     *
     * @return 返回用户集合
     * @throws Exception
     */
    public List<User> loadUser() throws Exception {
        String json = fs.read(Constant.SRC_USERS);
        List<User> userList = JSONObject.parseArray(json, User.class);
        if (maxID == -1) {
            maxID = userList.stream().max((o1, o2) -> o1.getId() - o2.getId()).get().getId();
        }
        return userList;

    }

    /**
     * 校验用户是否合法
     *
     * @param user
     * @return
     */
    public String checkUser(User user) {
//        if (user.getName().length() == 0) {
//            System.out.println("用户名不能为空");
//            return "用户名不能为空";
//        }
//        if (user.getPwd().length() == 0) {
//            System.out.println("密码不能为空");
//            return "密码不能为空";
//        }
        //校验用户名
        if(!user.getName().matches("[a-zA-Z0-9]{2,8}")){
            return "用户名只能为2-8位的数字或字母的组合";
        }
        //校验密码
        if(!user.getPwd().matches("[0-9a-zA-Z]{4,}")){
            return "为了您的安全,请使用4位以上的数字或字母组合作为密码";
        }
        //校验确认密码
        if (!user.getPwd().equals(user.getPwdConfirm())) {
            System.out.println("密码不一致");
            return "密码不一致";
        }
        return "true";
    }

    /**
     * 添加用户
     *
     * @param data
     * @return
     */
    public boolean addUser(String data) throws Exception {
        User user = JSONObject.parseObject(data, User.class);
        System.out.println(user);
        //校验用户是否合法
        String s = checkUser(user);
        if (!s.equals("true")) {
            ps.sendData(s, false);
            return false;
        }
        List<User> userList = loadUser();
        //校验用户是否已存在
        long count = userList.stream().filter(user1 -> user1.getName().equals(user.getName())).count();
        if (count != 0) {
            System.out.println("用户已存在");
            ps.sendData("用户已存在", false);
            return false;
        }
        user.setId(++maxID);
        user.setUserTypeStr();
        userList.add(user);
        fs.write(Constant.SRC_USERS, userList);
        ps.sendData("操作成功");
        return true;
    }

    /**
     * 获取当前在线用户
     *
     * @throws Exception
     */
    public void getOnlineUser() throws Exception {
        if(MySession.onlineUser!=null){
            ps.sendData(MySession.onlineUser.getName());
        }else
        {
            ps.sendData("");
        }
//        else {
//            ps.sendData("请先登录",false);
//        }
    }

    /**
     * 获取用户列表
     */
    public void getUsersList() throws Exception {
        String data = request.getData();
        User user = JSONObject.parseObject(data, User.class);
        List<User> userList = loadUser();
        //查询的是某些用户
        if (user.getName().length() != 0) {
            List<User> userList1 = userList.stream().filter(user1 -> user1.getName().contains(user.getName())).collect(Collectors.toList());
            userList = userList1;
        }
        ps.sendData(userList);
    }

    /**
     * 退出登录
     */
    public void quit() throws Exception {
        MySession.onlineUser = null;
        ps.toPage("/login.html");
    }

    /**
     * 获取用户
     *
     * @param data
     * @throws Exception
     */
    public void getUser(String data) throws Exception {
        User user = JSONObject.parseObject(data, User.class);
        List<User> userList = loadUser();
        User users = userList.stream().filter(user1 -> user1.getId() == user.getId()).findFirst().get();
        ps.sendData(users);
    }

    /**
     * 更新用户信息
     *
     * @param data
     * @throws Exception
     */
    public void updateUser(String data) throws Exception {
        User user = JSONObject.parseObject(data, User.class);
        //校验用户是否合法
        String s = checkUser(user);
        if (!s.equals("true")) {
            ps.sendData(s, false);
            return;
        }
        List<User> userList = loadUser();
        for (int i = 0; i < userList.size(); i++) {
            if (userList.get(i).getId() == user.getId()) {
                userList.set(i, user);
                break;
            }
        }
        fs.write(Constant.SRC_USERS, userList);
        ps.sendData("操作成功");
    }

    /**
     * 删除用户
     *
     * @param data
     */
    public void deleteUser(String data) throws Exception {
        User user = JSONObject.parseObject(data, User.class);
        List<User> userList = loadUser();
        User user2 = userList.stream().filter(user1 -> user1.getId() == user.getId()).findFirst().get();
        userList.remove(user2);
        fs.write(Constant.SRC_USERS, userList);
        ps.sendData("操作成功");

    }

}
